#include <iostream>
#include <vector>

using namespace std;

int main() {

	/*
	 * 说明：
	 * 1.可以用下标访问的容器有（既可以插入也可以赋值）：vector、deque、map；
	 * 2.特别要注意一下，vector和deque如果没有预先指定大小，是不能用下标法插入元素的！
	 * 3.序列式容器才可以在容器初始化的时候制定大小，关联式容器不行；
	 * 4.注意，关联容器的迭代器不支持it+n操作，仅支持it++操作。
	 *
	 * vector特点：
	 * 1.一个动态分配的数组(当数组空间内存不足时，都会执行: 分配新空间-复制元素-释放原空间);
	 * 2.当删除元素时，不会释放限制的空间，所以向量容器的容量(capacity)大于向量容器的大小(size);
	 * 3.对于删除或插入操作，执行效率不高，越靠后插入或删除执行效率越高;
	 * 4.高效的随机访问的容器。
	 * */

  	vector<int> vec(10);
  	vec.insert(vec.begin(), 10);
  	vec.insert(vec.begin(), 20);
  	vec.insert(vec.begin(), 30);
  	vec.insert(vec.begin(), 40);
  	vec.insert(vec.begin(), 50);

  	for (int i = 0; i < 10; i++) {
		cout << vec[i] << endl;		// []的方式，程序会宕机
  	}

  	for (int i = 0; i < 10; i++) {
		cout << vec.at(i) << endl;	// at的方式，可以捕捉到异常
  	}

  	cout << "---------------------------------" << endl;
	// 通过跌代替的方式
  	for (vector<int>::iterator it = vec.begin(); it != vec.end(); it ++) {
		cout << *it << endl;
  	}

	// 获取vec的头部元素迭代器
	vector<int>::iterator index = vec.begin();
	cout << "index: " << *index << endl;
	cout << "index: " << *(index + 2) << endl;

	// 根据迭代器去删除
	vec.erase(index);
  	for (vector<int>::iterator it = vec.begin(); it != vec.end(); it ++) {
		cout << *it << endl;
  	}

  	return 0;
}
